package com.dong.jdk8.ternary.operator;

import java.util.HashMap;
import java.util.Map;

/**
 * 三元表达式
 * 首先看一下三元运算符的格式
 * 　　[条件语句] ? [表达式1] : [表达式2]
 * <p>
 * 确定条件表达式结果类型的规则的核心是以下3点：
 * 　　1 如果表达式1和表达式2操作数具有相同的类型，那么它就是条件表达式的类型。
 * 　　2 如果一个表达式的类型是byte、short、char类型的，而另外一个是int类型的常量表达式，且它的值可以用类型byte、short、char三者之一表示的，那么条件表达式的类型就是三者之一
 * 　　3 否则，将对操作数类型进行二进制数字提升，而条件表达式的类型就是第二个和第三个操作数被提升之后的类型
 *
 * @author jianyang206881
 * @date 2017/11/23
 */
public class TernaryOperator {

    public void doNullPointerException() {
        Integer contentType = 1;
        Map<String, Object> queryMap = new HashMap<String, Object>(1);

        /*
        这行代码会报空指针,表达式2的类型会取决于表达式1的类型。
        表达式2是计算后的结果，会隐藏一个赋值操作，如果表达式1是基本类型，表达式2在赋值null的时候，就会报错。基本类型不能为null
         */
        queryMap.put("isConversion", contentType == null ? true : 2 == contentType ? true : null);

        System.out.println(queryMap);
    }

    public static void main(String[] args) {
        char a = 'a';
        int b = 42;

        // 定义3，int高于char，所以输出还是int  // int > char > 直接定义数值
        System.out.println("===a : b===>" + (false ? a : b));
        System.out.println("===a : 42===>" + (false ? a : 42));
        System.out.println("==='a' : 42===>" + (false ? 'a' : 42));
        System.out.println("===42 : a===>" + (false ? 42 : a));
        System.out.println("===Integer.valueOf(42) : a===>" + (false ? Integer.valueOf(42) : a));
        System.out.println("===b : 'a'===>" + (false ? b : 'a'));
        System.out.println("===b : a===>" + (false ? b : a));
    }

}
